home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Scene Storm
/
Scene Storm - Volume 1.iso
/
coding
/
asm
/
utils
/
paddle
/
paddle.asm
< prev
next >
Wrap
Assembly Source File
|
1980-01-03
|
7KB
|
261 lines
;
; ### Paddle routines by JM v 0.51 ###
;
; - Created 900715 by JM -
;
;
; This program reads paddles connected to mouse port #2.
;
;
; Bugs: yet unknown
;
;
; Edited:
;
; - 900715 by JM -> v0.01 - Basics from vertb.asm.
; - 900716 by JM -> v0.02 - Should work but worketh not.
; - 900717 by JM -> v0.50 - Worketh. Needed a call to WritePotgo().
; - 900722 by JM -> v0.51 - Final modifications. Code made smaller.
;
;
include "bb.i"
include "exec/types.i"
include "exec/execbase.i"
include "exec/tasks.i"
include "exec/nodes.i"
include "exec/memory.i"
include "exec/io.i"
include "exec/interrupts.i"
include "hardware/intbits.i"
include "hardware/custom.i"
include "libraries/dos.i"
OUTRY equ 1<<15
DATRY equ 1<<14
OUTRX equ 1<<13
DATRX equ 1<<12
OUTLY equ 1<<11
DATLY equ 1<<10
OUTLX equ 1<<9
DATLX equ 1<<8
START equ 1
STRUCTURE mv_VERTB,0 ; oma muuttuja-alue
APTR mv_maintask ; paaohjelman task-osoite
APTR mv_potgores ; resourcen osoite
ULONG mv_sigmask ; signaalimaski
UWORD mv_potdata ; luettu data
UWORD mv_firedata ; nappuloiden tilat
LABEL mv_SIZE ; struktuurin koko
xref _LVOOldOpenLibrary
xref _LVOOpenResource
xref _LVOAllocPotBits
xref _LVOFreePotBits
xref _LVOAllocMem
xref _LVOAllocSignal
xref _LVOFindTask
xref _LVOAddIntServer
xref _LVOWait
xref _LVORawDoFmt
xref _LVOOutput
xref _LVOWrite
xref _LVORemIntServer
xref _LVOFreeSignal
xref _LVOFreeMem
xref _LVOCloseLibrary
xref _LVOSignal
xref _LVOWritePotgo
.DosBase equ -4 ; muuttujat pinossa (offsetit)
.PotgoBase equ -8
potbits equ -12
VERTB_signal equ -13
int_added equ -14
MEM set 4 ; tarvittavan muistin määrä
MEMPTR equ -20 ; osoitin pinossa
interrupt equ -24 ; osoitin pinossa
MEM set MEM+(IS_SIZE) ; lisätään muistin määrään
data equ -28 ; osoitin pinossa
MEM set MEM+(mv_SIZE) ; lisätään muistin määrään
buffer equ -32 ; osoitin pinossa
MEM set MEM+(256) ; muistin kokonaismäärä
main link a4,#-32 ; varataan muuttujatila
movem.l d0/a4,-(sp)
moveq #7,d0
1$ clr.l -(a4) ; nollataan pinossa olevat muuttujat
dbf d0,1$
movem.l (sp)+,d0/a4
st VERTB_signal(a4) ; lippu: sigbit ei varattu
lea .DosName(pc),a1 ; dos-kirjaston nimi
move.l $4,a6
jsr _LVOOldOpenLibrary(a6) ; mikä tahansa kirjastoversio kelpaa
move.l d0,.DosBase(a4)
beq cleanup ; jos ei auennut, pois
lea .PResName(pc),a1 ; potgo.resourcen nimi
moveq #0,d0
jsr _LVOOpenResource(a6) ; avataan potgo.resource
move.l d0,.PotgoBase(a4)
beq cleanup ; jos ei auennut, pois
move.l #OUTRY|DATRY|OUTRX|DATRX|START,d0
move.l d0,d2 ; tarvittavat bitit
move.l .PotgoBase(a4),a6
jsr _LVOAllocPotBits(a6)
move.l d0,potbits(a4) ; varatut bitit
cmp.l d0,d2
bne cleanup ; ei saatu kaikkia bittejä
move.l #MEM,d0 ; varataan muistia
move.l #MEMF_CLEAR!MEMF_PUBLIC,d1
move.l $4,a6
jsr _LVOAllocMem(a6)
move.l d0,MEMPTR(a4) ; varatun alueen osoite
beq cleanup ; jos nolla, ei saatu muistia
move.l d0,a0
move.l #MEM,(a0)+ ; varatun alueen pituus
move.l a0,interrupt(a4) ; interrupt-struktuurin osoite
lea (IS_SIZE)(a0),a0
move.l a0,data(a4) ; muuttuja-alueen osoite
lea (mv_SIZE)(a0),a0
move.l a0,buffer(a4) ; tulostuspuskurin osoite
move.l data(a4),a2 ; muuttuja-alueen osoite
moveq #-1,d0 ; mikä tahansa bitti kelpaa
jsr _LVOAllocSignal(a6) ; varataan signaali
move.b d0,VERTB_signal(a4) ; tallennetaan bitin nro
moveq #0,d1
bset d0,d1 ; asetetaan sigbit-bitti
move.l d1,mv_sigmask(a2) ; tallennetaan signaalimaski
move.l .PotgoBase(a4),mv_potgores(a2) ; resourcen osoite
sub.l a1,a1
jsr _LVOFindTask(a6) ; etsitaan oma task
move.l d0,mv_maintask(a2) ; osoite muuttujatilaan
move.l interrupt(a4),a1 ; Interrupt-struktuuri
move.b #NT_INTERRUPT,LN_TYPE(a1) ; noden tyyppi = INTERRUPT
move.b #1,LN_PRI(a1) ; noden prioriteetti = 1
lea intr_name(pc),a0 ; noden nimi
move.l a0,LN_NAME(a1) ; nimen osoite struktuuriin
lea.l irqcode(pc),a0 ; keskeytysrutiinin osoite
move.l a0,IS_CODE(a1) ; osoite struktuuriin
move.l a2,IS_DATA(a1) ; muuttuja-alueen osoite
moveq #INTB_VERTB,d0 ; keskeytyksen tyyppi
jsr _LVOAddIntServer(a6) ; käynnistetään keskeytys
st int_added(a4)
loop moveq #0,d0
move.b VERTB_signal(a4),d1 ; odotetaan keskeytyksen
bset d1,d0 ; antamaa signaalia
moveq #SIGBREAKB_CTRL_C,d1 ; ja CTRL+C:n painamista
bset d1,d0
move.l $4,a6
jsr _LVOWait(a6) ; ohjelma nukkumaan
btst #SIGBREAKB_CTRL_C,d0
bne cleanup
lea fmtstr(pc),a0 ; format-rivi
moveq #0,d0
moveq #0,d1
move.l data(a4),a2 ; muuttuja-alue
move.b mv_potdata(a2),d0 ; paddle
move.b mv_potdata+1(a2),d1 ; toinen paddle
move.w mv_firedata(a2),-(sp) ; tulitusnappulat
move.w d1,-(sp) ; luvut pinoon
move.w d0,-(sp)
move.l sp,a1 ; osoitin lukuihin
lea.l putch(pc),a2 ; putchar-rutiinin osoite
move.l buffer(a4),a3 ; tulostuspuskuri
move.l $4,a6
jsr _LVORawDoFmt(a6) ; formatoidaan tulostus
addq.l #6,sp ; sp takaisin kohdalleen
move.l a3,d2
moveq #33,d3
move.l .DosBase(a4),a6
jsr _LVOOutput(a6) ; tulostustiedosto
move.l d0,d1
beq.s cleanup ; nolla -> ei voida tulostaa
jsr _LVOWrite(a6) ; tulostus
bra loop
putch move.b d0,(a3)+ ; putchar-rutiini
rts
cleanup tst.b int_added(a4) ; keskeytysrutiini
beq.s ._8 ; toiminnassa?
move.l interrupt(a4),a1
moveq #INTB_VERTB,d0
move.l $4,a6
jsr _LVORemIntServer(a6) ; poistetaan keskeytykset
._8 moveq #0,d0
move.b VERTB_signal(a4),d0 ; vapautetaan signaalibitti,
bmi.s ._9 ; jos se oli varattu
move.l $4,a6
jsr _LVOFreeSignal(a6)
._9 move.l potbits(a4),d0
beq.s ._A
move.l .PotgoBase(a4),a6
jsr _LVOFreePotBits(a6)
._A move.l MEMPTR(a4),d0 ; vapautetaan muisti
beq.s ._B
move.l d0,a1
move.l (a1),d0
move.l $4,a6
jsr _LVOFreeMem(a6)
clr.l MEMPTR(a4)
._B move.l .DosBase(a4),d0 ; suljetaan dos
beq.s ._C
move.l d0,a1
move.l $4,a6
jsr _LVOCloseLibrary(a6)
clr.l .DosBase(a4)
._C moveq #0,d0 ; virhekoodi = 0
unlk a4
rts
irqcode lea $dff000,a0 ; custom-piirit
move.w pot1dat(a0),mv_potdata(a1) ; luetaan paddle
move.w joy1dat(a0),d0 ; painikkeet
move.w d0,d1
lsr.w #1,d1
and.w #$0101,d1 ; muut bitit pois
eor.w d1,d0
move.w d0,d1
and.w #$0003,d0 ; taas liiat pois
and.w #$0300,d1 ; tästä myös
lsr.w #6,d1 ; molemmat tavut samaan
or.b d1,d0
move.w d0,mv_firedata(a1) ; nappuloiden tilat
move.l mv_potgores(a1),a5 ; potgo base talteen
move.l mv_sigmask(a1),d0 ; signaalimaski
move.l mv_maintask(a1),a1 ; taski
move.l $4,a6
jsr _LVOSignal(a6) ; annetaan signaali
move.l a5,a6 ; potgo base
moveq #1,d0
moveq #1,d1 ; käynnistetään uusi muunnos
jsr _LVOWritePotgo(a6)
moveq #0,d0 ; tieto Execille, että
rts ; keskeytysketju voi jatkua
intr_name:
dc.b 'My_Paddle_Intr',0 ; keskeytyksen nimi
.DosName:
dc.b 'dos.library',0
.PResName:
dc.b 'potgo.resource',0
fmtstr dc.b ' Paddle value: %3.3d %3.3d Fire: %02.2x',13,0
ds.w 0
end